using System.Collections.Generic;
using System.Reflection;
using UnityEngine;

namespace ExceptionModule
{
    /// <summary>
    /// 日志处理方式
    /// </summary>
    public static class LogHandleType
    {
        /// <summary>
        /// 记录到UnityEditor的控制台
        /// </summary>
        public const int LogToConsole = 2;

        /// <summary>
        /// 记录到文件
        /// </summary>
        public const int LogToFile = 4;

        /// <summary>
        /// 弹出UI显示
        /// </summary>
        public const int LogToUI = 8;
    }

    /// <summary>
    /// 日志配置接口
    /// </summary>
    public interface ILogConfiguration
    {
        /// <summary>
        /// 对指定的namespace进行配置， 相同namespace使用相同的处理
        /// </summary>
        /// <param name="moduleAuthor">模块作者</param>
        /// <typeparam name="TModule">模块内部的任何一个类</typeparam>
        void Add<TModule>(string moduleAuthor);

        /// <summary>
        /// 对指定的namespace进行配置， 相同namespace使用相同的处理
        /// </summary>
        /// <param name="moduleAuthor">模块作者</param>
        /// <param name="logHandleType">处理类型</param>
        void Add<TModule>(string moduleAuthor, int logHandleType);

        /// <summary>
        /// 对指定的namespace进行配置， 相同namespace使用相同的处理
        /// </summary>
        /// <param name="moduleAuthor">模块作者</param>
        /// <param name="handleMapping">每种日志类型对应的处理方式</param>
        void Add<TModule>(string moduleAuthor, Dictionary<LogType, int> handleMapping);

        /// <summary>
        /// 对指定的namespace进行配置， 相同namespace使用相同的处理
        /// </summary>
        /// <param name="namespaceName">命名空间的名字</param>
        /// <param name="moduleAuthor">模块作者</param>
        void Add(string namespaceName, string moduleAuthor);

        /// <summary>
        /// 对指定的namespace进行配置， 相同namespace使用相同的处理
        /// </summary>
        /// <param name="namespaceName">命名空间的名字</param>
        /// <param name="moduleAuthor">模块作者</param>
        /// <param name="logHandleType">处理类型</param>
        void Add(string namespaceName, string moduleAuthor, int logHandleType);

        /// <summary>
        /// 对指定的namespace进行配置， 相同namespace使用相同的处理
        /// </summary>
        /// <param name="namespaceName">命名空间的名字</param>
        /// <param name="moduleAuthor">模块作者</param>
        /// <param name="handleMapping">每种日志类型对应的处理方式</param>
        void Add(string namespaceName, string moduleAuthor, Dictionary<LogType, int> handleMapping);

        /// <summary>
        /// 获得指定命名空间的所有日志类型对应的处理方式
        /// </summary>
        /// <param name="method">命名空间的名字</param>
        /// <returns></returns>
        Dictionary<LogType, int> GetLogHandlerType(MethodBase method);
        
        /// <summary>
        /// 获得指定命名空间和日志类型的处理方式
        /// </summary>
        /// <param name="method">命名空间的名字</param>
        /// <param name="logType">日志类型</param>
        /// <returns></returns>
        int GetLogHandlerType(MethodBase method, LogType logType);

        /// <summary>
        /// 获取模块作者
        /// </summary>
        /// <param name="method"></param>
        /// <returns>返回模块的作者</returns>
        string GetModuleAuthor(MethodBase method);

        /// <summary>
        /// 设置全局的配置
        /// </summary>
        /// <param name="logType"></param>
        /// <param name="logHandleType">处理类型</param>
        void AddGlobalConfiguration(LogType logType, int logHandleType);
    }
}